package com.ujoku.payment.alipay;

import com.labillusion.core.platform.web.rest.exception.InvalidRequestException;
import com.labillusion.core.util.HttpUtils;
import com.labillusion.core.util.SequenceNumUtils;
import com.ujoku.domain.MemberBalanceLog;
import com.ujoku.domain.OrderPayment;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/* *
 *类名：AlipayFunction
 *功能：支付宝接口公用函数类
 *详细：该类是请求、通知返回两个文件所调用的公用函数核心处理文件，不需要修改
 *版本：3.3
 *日期：2012-08-14
 *说明：
 *以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用，只是提供一个参考。
 */

public class AlipayCore {

    /** 
     * 除去数组中的空值和签名参数
     * @param sArray 签名参数组
     * @return 去掉空值与签名参数后的新签名参数组
     */
    public static Map<String, String> paraFilter(Map<String, String> sArray) {

        Map<String, String> result = new HashMap<String, String>();

        if (sArray == null || sArray.size() <= 0) {
            return result;
        }

        for (String key : sArray.keySet()) {
            String value = sArray.get(key);
            if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
                || key.equalsIgnoreCase("sign_type")) {
                continue;
            }
            result.put(key, value);
        }

        return result;
    }

    /** 
     * 把数组所有元素排序，并按照“参数=参数值”的模式用“&”字符拼接成字符串
     * @param params 需要排序并参与字符拼接的参数组
     * @return 拼接后字符串
     */
    public static String createLinkString(Map<String, String> params) {

        List<String> keys = new ArrayList<String>(params.keySet());
        Collections.sort(keys);

        String prestr = "";

        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = params.get(key);

            if (i == keys.size() - 1) {//拼接时，不包括最后一个&字符
                prestr = prestr + key + "=" + value;
            } else {
                prestr = prestr + key + "=" + value + "&";
            }
        }

        return prestr;
    }

    public static void verifyReturnRequest(Map<String,String> params) {
        //获取支付宝GET过来反馈信息

        //计算得出通知验证结果
        boolean verify_result = AlipayNotify.verify(params);
        if(!verify_result)
            throw new InvalidRequestException("非法请求!");
    }


    public static void verifyReturnRequest(HttpServletRequest request) {
        //获取支付宝GET过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        //计算得出通知验证结果
        boolean verify_result = AlipayNotify.verify(params);
        if(!verify_result)
            throw new InvalidRequestException("非法请求!");
    }

    public static Map<String, String> buildRechargeRequestMap(HttpServletRequest request, String returnUrl, MemberBalanceLog log) {
        //支付类型
        String payment_type = "1";
        //必填，不能修改
        //服务器异步通知页面路径
        String notify_url = HttpUtils.getBasePath(request) + "/alipay/recharge/notify";
        //需http://格式的完整路径，不能加?id=123这类自定义参数		//页面跳转同步通知页面路径
        //String return_url = HttpUtils.getBasePath(request) + "/alipay/return";
        String return_url = returnUrl;
        //需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/		//卖家支付宝帐户
        String seller_email = AlipayConfig.WIDseller_email;
        //必填		//商户订单号
        String out_trade_no = log.getId();

        //商户网站订单系统中唯一订单号，必填		//订单名称
        String subject = new String("会员充值");
        //必填		//付款金额
        String total_fee = String.valueOf(log.getAmount());
        //必填		//订单描述
        String body = new String("会员充值");
        //商品展示地址
        //String show_url = new String(HttpUtils.getBasePath(request) + "/p/"+ payment.getProductId());

        //把请求参数打包成数组
        Map<String, String> sParaTemp = new HashMap<String, String>();
        sParaTemp.put("service", "create_direct_pay_by_user");
        sParaTemp.put("partner", AlipayConfig.partner);
        sParaTemp.put("_input_charset", AlipayConfig.input_charset);
        sParaTemp.put("payment_type", payment_type);
        sParaTemp.put("notify_url", notify_url);
        sParaTemp.put("return_url", return_url);
        sParaTemp.put("seller_email", seller_email);
        sParaTemp.put("out_trade_no", out_trade_no);
        sParaTemp.put("subject", subject);
        sParaTemp.put("total_fee", total_fee);
        sParaTemp.put("body", body);
        //sParaTemp.put("show_url", show_url);
        return sParaTemp;
    }

    public static Map<String, String> buildRequestMap(HttpServletRequest request,OrderPayment payment, String returnUrl) {
        //支付类型
        String payment_type = "1";
        //必填，不能修改
        //服务器异步通知页面路径
        String notify_url = HttpUtils.getBasePath(request) + "/alipay/notify";
        //需http://格式的完整路径，不能加?id=123这类自定义参数		//页面跳转同步通知页面路径
        //String return_url = HttpUtils.getBasePath(request) + "/alipay/return";
        String return_url = returnUrl;
        //需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/		//卖家支付宝帐户
        String seller_email = AlipayConfig.WIDseller_email;
        //必填		//商户订单号
        String out_trade_no = payment.getOrderId();

        //商户网站订单系统中唯一订单号，必填		//订单名称
        String subject = new String(payment.getGoodsName());
        //必填		//付款金额
        String total_fee = String.valueOf(payment.getAmount());
        //必填		//订单描述
        String body = new String(payment.getGoodsName());
        //商品展示地址
        //String show_url = new String(HttpUtils.getBasePath(request) + "/p/"+ payment.getProductId());

        //把请求参数打包成数组
        Map<String, String> sParaTemp = new HashMap<String, String>();
        sParaTemp.put("service", "create_direct_pay_by_user");
        sParaTemp.put("partner", AlipayConfig.partner);
        sParaTemp.put("_input_charset", AlipayConfig.input_charset);
        sParaTemp.put("payment_type", payment_type);
        sParaTemp.put("notify_url", notify_url);
        sParaTemp.put("return_url", return_url);
        sParaTemp.put("seller_email", seller_email);
        sParaTemp.put("out_trade_no", out_trade_no);
        sParaTemp.put("subject", subject);
        sParaTemp.put("total_fee", total_fee);
        sParaTemp.put("body", body);
        //sParaTemp.put("show_url", show_url);
        return sParaTemp;
    }

}
